/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jmysql.CUsuario;
import validaciones.ValidacionData;
import validaciones.ValidateCompare2JSON;
import validaciones.ValidateJSON;

/**
 *
 * @author dblack
 */
public class CModificarUsuario extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

		// TODO Auto-generated method stub
		ValidateJSON new_data=new ValidateJSON();//la nueva data a cambiar
		ValidateJSON old_data;//los viejos datos
		ValidacionData validacion=new ValidacionData();//para guardar el json de envio
		
		/*Guardamos la nueva data*/	 
		new_data.put("new_nombre", request.getParameter("new_nombre").trim());
		new_data.put("new_nomusuario", request.getParameter("new_nomusuario").trim().toLowerCase());
		new_data.put("new_nopersonal", request.getParameter("new_nopersonal"));
		new_data.put("new_telefono", request.getParameter("new_telefono").trim());
		new_data.put("new_correo", request.getParameter("new_correo").trim());
		new_data.put("new_estado", Integer.parseInt(request.getParameter("new_estado")));
		new_data.put("new_password", request.getParameter("new_password").trim());
		new_data.put("new_repassword", request.getParameter("new_repassword").trim());
		int idusuario=Integer.parseInt(request.getParameter("idusuario"));
		
		
		/*Validación*/
		//validaciones de vacio
		if(validacion.correcto&&new_data.getString("new_nombre").length()==0)
			validacion.SetValores("1", "m_nombre", "el campo no puede ser vacío", false);
		
		if(validacion.correcto&&new_data.getString("new_nombre").length()>70)
			validacion.SetValores("1", "m_nombre", "la longitud del campo es muy grande", false);
		
		//validaciones de longitud y expresiones regulares
		if(validacion.correcto&&!new_data.getString("new_nopersonal").matches("^[0-9]{1,15}$"))
			validacion.SetValores("2", "m_nopersonal", "datos inválidos", false);
		if(validacion.correcto&&!new_data.getString("new_nomusuario").matches("^([a-zA-Z])[a-zA-Z0-9_]{3,30}$"))
			validacion.SetValores("2", "m_nomusuario", "datos inválidos", false);	
		
		/*Solo cambia el password si es que va cambiar*/
		if(validacion.correcto
				&&(new_data.getString("new_password").length()>0||new_data.getString("new_repassword").length()>0)
				&&!new_data.getString("new_password").matches("^[A-Za-z0-9]{3,40}$"))
			validacion.SetValores("2", "m_password", "datos inválidos", false);
		
		//validacion de password similares
		if(validacion.correcto&&(new_data.getString("new_password").length()>0||new_data.getString("new_repassword").length()>0)){ //solo si amerita cambios, de lo contrario no se hace nada
			if(validacion.correcto&&new_data.getString("new_password").compareTo(new_data.getString("new_repassword"))!=0)
				validacion.SetValores("3", "m_password", "Los passwords deben ser idénticos", false);
		}
		
		/*Llamamos la vieja data*/
		CUsuario cu=new CUsuario();
		old_data=new ValidateJSON(cu.GetUsuarioConEstado(idusuario));


		/*Creamos la instancia para comparar*/
		ValidateCompare2JSON compare2JSON=new ValidateCompare2JSON(old_data.getJSONObject(),new_data.getJSONObject());
		
		//comparamos recibe el campo que cambiará, los datos a comparar old y new
		if(validacion.correcto&&!compare2JSON.BooleanCompareIgnoreCase("nomusuario","nomusuario","new_nomusuario")){
					//ya que no son iguales, debe compararse en la base de datos
			if(cu.Existe(new_data.getString("new_nomusuario")))
				validacion.SetValores("20", "m_nomusuario", "este nombre de usuario ya existe en el sistema", false);
		}

		//Faltan los demás comparaciones
		if(validacion.correcto){
			
			/*Nopersonal es pasado a entero para ser comparado*/
			new_data.replaceInt("new_nopersonal", Integer.parseInt(new_data.getString("new_nopersonal")));
			
			compare2JSON.Compare("nombre","nombre","new_nombre");
			compare2JSON.Compare("nopersonal","nopersonal","new_nopersonal");
			compare2JSON.Compare("telefono","telefono","new_telefono");
			compare2JSON.Compare("correo","correo","new_correo");
			compare2JSON.Compare("estado","estado","new_estado");
			
			if(new_data.getString("new_password").length()>0||new_data.getString("new_repassword").length()>0)//solo cambia, si el usuario dispuso a cambiar cosas
				compare2JSON.Compare("password","password","new_password");
		}
				
		
		//podemos proseguir ya que sigue correcto y la longitud en >0
		if(validacion.correcto&&compare2JSON.getQuery().length()>0){
			if(cu.UpdateUsuario(idusuario,compare2JSON.getQuery())){
				validacion.SetValores("10", "-", "Datos actualizados con éxito", true);
			}else{//fallo el update
				validacion.SetValores("30", "m_nompersonal", "Fallo la actualización", false);
			}
		}else if(validacion.correcto&&compare2JSON.getQuery().length()==0){//no hay cambios
			validacion.SetValores("10", "-", "Datos actualizados con éxito", true);
		}
		
		/*Actualización de permisos*/
		if(validacion.correcto){
			String new_permisos=request.getParameter("new_permisos");
			cu.ModificarPermisos(idusuario, new_permisos);
		}
		
		if(validacion.correcto)
			validacion.SetValores("10", "-", "Datos actualizados con éxito", true);
		//enviamos mensaje de respuesta
		PrintWriter out = response.getWriter();		
		response.setContentType("application/json");
				
		//imprimimos el valor de json
		out.print(validacion.getJSON());
		out.close();
          
    }

    
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
